#include "head.h"


int pipe_fd[2];

void func(int num){
    write(pipe_fd[1], "1", 1);
}
int main(){
    puts("服务器启动中...");

    pipe(pipe_fd);

    if(fork() != 0){
        // 父进程
        signal(2, func);


        wait(NULL);
        exit(0);
    }

   // 子进程脱离前台进程组
    setpgid(0, 0);
    
    // 初始化状态的参数: (启动子线程)
    status_t status;
    initStatus(&status,3);

    int socket_fd;
    initSocket(&socket_fd, "127.0.0.0", "8080");

    int epoll_fd = epoll_create(1);
    
    // 让socket对象被epoll监听
    addEpoll(epoll_fd, socket_fd);

    addEpoll(epoll_fd, pipe_fd[0]);

    puts("服务器启动完成\n");
    while(1){

        struct epoll_event list[10];
        int epoll_num = epoll_wait(epoll_fd,  list, 10, -1);

        for(int i=0; i<epoll_num; i++){
            int fd = list[i].data.fd;

           if(fd == pipe_fd[0]){
               // 说明有信号
               char buf[60] = {0};
               read(pipe_fd[0], buf, sizeof(buf));

               pthread_mutex_lock(&status.lock);
               status.exitFlag = 1; 
               pthread_cond_broadcast(&status.cond);
               pthread_mutex_unlock(&status.lock);

               // 等待子线程退出
               for(int j=0; j<status.num; j++){
                   pthread_join(status.thread_ids[j], NULL);
               }
               // 所有子线程都退出
               pthread_exit(NULL);
           }

            if(fd == socket_fd){
                // 有新链接进来
                int net_fd = accept(socket_fd, NULL, NULL);

                // 放入队列
                pthread_mutex_lock(&status.lock);
                enQueue(&status.queue, net_fd);
                // 唤醒子线程, 开始取队列(任务)
                pthread_cond_signal(&status.cond);
                pthread_mutex_unlock(&status.lock);

            }

        }


    }

    return 0;
}

